package com.jinyang.jetpackdemo.paging3

import androidx.paging.ExperimentalPagingApi
import androidx.paging.LoadType
import androidx.paging.PagingState
import androidx.paging.RemoteMediator
import androidx.room.withTransaction
import com.jinyang.jetpackdemo.AppHelper
import com.jinyang.jetpackdemo.ext.isConnectedNetwork

/**
 * @Author:         LiuJinYang
 * @CreateDate:     2021/8/18
 * @Description:
 */
@OptIn(ExperimentalPagingApi::class)
class RepoMediator(
    val api: ApiService,
    val db: AppDatabase
) : RemoteMediator<Int, RepoEntity>() {
    override suspend fun load(
        loadType: LoadType,
        state: PagingState<Int, RepoEntity>
    ): MediatorResult {
        val repoDao = db.repoDao()
        val pageKey = when (loadType) {
            //首次访问 或者调用 PagingDataAdapter.refresh()时
            LoadType.REFRESH -> null
            //在当前加载的数据集的开头加载数据时
            LoadType.PREPEND -> return MediatorResult.Success(endOfPaginationReached = true)
            //下拉加载更多时
            LoadType.APPEND -> {
                /**
                 *
                 * 这里主要获取下一页数据的开始位置，可以理解为从什么地方开始加载下一页数据
                 * 这里有两种方式来获取下一页加载数据的位置
                 * 方式一：这种方式比较简单，当前页面最后一条数据是下一页的开始位置
                 * 方式二：比较麻烦，当前分页数据没有对应的远程 key，这个时候需要我们自己建表,
                 */

                /**
                 * 方式一：这种方式比较简单，当前页面最后一条数据是下一页的开始位置
                 * 通过 load 方法的参数 state 获取当页面最后一条数据
                 */
                val lastItem = state.lastItemOrNull()
                if (lastItem == null) {
                    return MediatorResult.Success(
                        endOfPaginationReached = true
                    )
                }
                lastItem.page

                /**
                 * 方式二：比较麻烦，当前分页数据没有对应的远程 key，这个时候需要我们自己建表
                 */
//                    val remoteKey = db.withTransaction {
//                        db.remoteKeysDao().getRemoteKeys(remotePokemon)
//                    }
//                    if (remoteKey == null || remoteKey.nextKey == null) {
//                        return MediatorResult.Success(endOfPaginationReached = true)
//                    }
//                    remoteKey.nextKey
            }
        }

        //无网络则加载本地数据
        if (!AppHelper.mContext.isConnectedNetwork()) {
            return MediatorResult.Success(endOfPaginationReached = true)
        }

        //请求网络分页数据
        val page = pageKey ?: 0
        val pageSize = Repository.PAGE_SIZE
        val result = api.searRepos(page, pageSize).items
        val endOfPaginationReached = result.isEmpty()
        val items = result.map {
            RepoEntity(
                id = it.id,
                name = it.name,
                description = it.description,
                starCount = it.starCount,
                page=page + 1
            )
        }

        //插入数据库
        db.withTransaction {
            if (loadType==LoadType.REFRESH){
                repoDao.clear()
            }
            repoDao.insert(items)
        }

        return MediatorResult.Success(endOfPaginationReached = endOfPaginationReached)
    }

}